package org.puc.enquete.filter;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.puc.enquete.ejb.UsuarioBeanLocal;
import org.puc.enquete.entity.Usuario;

/**
 * Este filtro captura cada requisição e valida o usuário
  */
public class FiltroValidacaoUsuario implements Filter {

    private static final boolean debug = true;

    private FilterConfig filterConfig = null;

    public FiltroValidacaoUsuario() {
    } 

    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain)
	throws IOException, ServletException {

        //recupera sessão
        HttpSession sessao = ((HttpServletRequest) request).getSession(true);

	//verificar usuário
        Usuario usuario = (Usuario) sessao.getAttribute("usuario");

        //se não há usuário ou se o atual está deslogando
        if (usuario == null || request.getParameter("deslogar") != null) {

            //cria um usuário vazio na sessão
            usuario = new Usuario();
            usuario.setNome("Visitante");
            sessao.setAttribute("usuario", usuario);

        }

        //verifica se está tentando logar
        if (request.getParameter("logar") != null) {

            String login = request.getParameter("login");
            String senha = request.getParameter("senha");

            //valida dados do formulário
            if (login == null || login.length() < 5) {

                request.setAttribute("erro", "Erro: login inválido!");

            } else if (senha == null || senha.length() == 0) {

                request.setAttribute("erro", "Erro: senha inválida!");

            } else {

                try {

                    UsuarioBeanLocal usuarioBean = lookupUsuarioBeanLocal();
                    Usuario usuarioValidacao = usuarioBean.recuperaUsuario(login);

                    //valida senha
                    if (usuarioValidacao.getSenha().equals(senha)) {

                        sessao.setAttribute("usuario", usuarioValidacao);

                    } else {

                        throw new Exception("senha incorreta!");

                    }

                } catch (Exception e) {

                    e.printStackTrace();
                    request.setAttribute("erro", "Erro: " + e.getMessage());

                }

            }

        }

        //chama o próximo nó da fila (provavelmente o servlet)
	try {
	    chain.doFilter(request, response);
	} catch(Throwable t) {
	    t.printStackTrace();
	}

    }
    
    public void destroy() { 
    }

    public void init(FilterConfig filterConfig) { 
	this.filterConfig = filterConfig;
    }

    public void log(String msg) {
	filterConfig.getServletContext().log(msg); 
    }

    private UsuarioBeanLocal lookupUsuarioBeanLocal() {
        try {
            Context c = new InitialContext();
            return (UsuarioBeanLocal) c.lookup("java:comp/env/UsuarioBean");
        } catch (NamingException ne) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

}
